package helexis.game.tyrian.service;

import helexis.game.tyrian.Tyrian;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.audio.Music;
import com.badlogic.gdx.utils.Disposable;

public class MusicManager implements Disposable {
	
	
	public enum TyrianMusic {
		
		MENU("music/menu.ogg"),
		LEVEL("music/level.ogg");
		
		private String fileName;
		
		private TyrianMusic(String fileName) {
			this.fileName = fileName;
		}//end of constructor

		public String getFileName() {
			return fileName;
		}
		
	}//end inner-enum TyrianMusic
	
	
	/**
	 * 현재 플레이되고 있는 음악
	 */
	private Music musicBeingPlayed;
	
	/**
	 * 음악 볼륨
	 */
	private float volume = 1f;
	
	/**
	 * 음악 활성화 여부
	 */
	private boolean enabled = true;
	
	
	
	public MusicManager() {
		
	}//end of constructor

	
	/**
	 * 주어진 음악을 플레이 합니다.
	 * 
	 * @param music TyrianMusic
	 */
	public void play(TyrianMusic music) {
		
		if (!this.enabled) {
			return;
		}//end if
		
		Gdx.app.log(Tyrian.LOG, "Playing music : " + music.name());
		
		/*
		 * 지금 현재 플레이되고 있는 음악이 뭐든간에
		 * 일단 정지 시키고 다시 플레이 시킨다.
		 */
		this.stop();
		
		this.musicBeingPlayed = Gdx.audio.newMusic(Gdx.files.internal(music.getFileName()));
		this.musicBeingPlayed.setVolume(this.volume);
		this.musicBeingPlayed.setLooping(true);
		this.musicBeingPlayed.play();
		
	}//end of play()
	
	
	/**
	 * 현재 플레이 중인 음악을 종료시킵니다.
	 */
	public void stop() {
		
		if (this.musicBeingPlayed != null) {
			Gdx.app.log(Tyrian.LOG, "Stopping current Music...");
			this.musicBeingPlayed.stop();
			this.musicBeingPlayed.dispose();
		}//end if
		
	}//end of stop()
	
	
	/**
	 * 음악 볼륨을 설정합니다.
	 * 
	 * @param volume 볼륨
	 */
	public void setVolume(float volume) {
		
		Gdx.app.log(Tyrian.LOG, "Adjusting music volume to : " + volume);
		
		/*
		 * 경계 조건 컨트롤
		 * 
		 * Exception 을 발생시키는 것 보다는 그냥 최대/최소 값으로 설정함
		 */
		
		if (0 > volume) {
			this.volume = 0;
		} else if (1f < volume) {
			this.volume = 1f;
		} else {
			this.volume = volume;
		}//end if else
		
		if (this.musicBeingPlayed != null) {
			this.musicBeingPlayed.setVolume(this.volume);
		}//end if
		
	}//end of setVolume()
	
	
	/**
	 * 음악 볼륨을 설정합니다.
	 * 
	 * @param enabled 음악 볼륨
	 */
	public void setEnabled(boolean enabled) {
		
		Gdx.app.log(Tyrian.LOG, "Turn off music...");
		
		this.enabled = enabled;
		
		/*
		 * 만약, 음악 볼륨 설정을 꺼버리면
		 * 현재 플레이 중인 음악을 중지시킨다.
		 */
		
		if (!enabled) {
			this.stop();
		}//end if
		
	}//end of setEnabled()
	


	@Override
	public void dispose() {
		
		Gdx.app.log(Tyrian.LOG, "Disposing MusicManager...");
		
		this.stop();
		
	}//end of dispose()	
	

}
//end of MusicManager.java